/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import Controladores.exceptions.IllegalOrphanException;
import Controladores.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Entidades.Asignacionperiodocurso;
import java.util.ArrayList;
import java.util.Collection;
import Entidades.Asignacionperiodoaula;
import Entidades.Asignacionperiodocatedratico;
import Entidades.Periodo;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author userlab05
 */
public class PeriodoJpaController implements Serializable {

    public PeriodoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Periodo periodo) {
        if (periodo.getAsignacionperiodocursoCollection() == null) {
            periodo.setAsignacionperiodocursoCollection(new ArrayList<Asignacionperiodocurso>());
        }
        if (periodo.getAsignacionperiodoaulaCollection() == null) {
            periodo.setAsignacionperiodoaulaCollection(new ArrayList<Asignacionperiodoaula>());
        }
        if (periodo.getAsignacionperiodocatedraticoCollection() == null) {
            periodo.setAsignacionperiodocatedraticoCollection(new ArrayList<Asignacionperiodocatedratico>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Collection<Asignacionperiodocurso> attachedAsignacionperiodocursoCollection = new ArrayList<Asignacionperiodocurso>();
            for (Asignacionperiodocurso asignacionperiodocursoCollectionAsignacionperiodocursoToAttach : periodo.getAsignacionperiodocursoCollection()) {
                asignacionperiodocursoCollectionAsignacionperiodocursoToAttach = em.getReference(asignacionperiodocursoCollectionAsignacionperiodocursoToAttach.getClass(), asignacionperiodocursoCollectionAsignacionperiodocursoToAttach.getIdAsignacionPeriodoCurso());
                attachedAsignacionperiodocursoCollection.add(asignacionperiodocursoCollectionAsignacionperiodocursoToAttach);
            }
            periodo.setAsignacionperiodocursoCollection(attachedAsignacionperiodocursoCollection);
            Collection<Asignacionperiodoaula> attachedAsignacionperiodoaulaCollection = new ArrayList<Asignacionperiodoaula>();
            for (Asignacionperiodoaula asignacionperiodoaulaCollectionAsignacionperiodoaulaToAttach : periodo.getAsignacionperiodoaulaCollection()) {
                asignacionperiodoaulaCollectionAsignacionperiodoaulaToAttach = em.getReference(asignacionperiodoaulaCollectionAsignacionperiodoaulaToAttach.getClass(), asignacionperiodoaulaCollectionAsignacionperiodoaulaToAttach.getIdAsignacionPeriodoAula());
                attachedAsignacionperiodoaulaCollection.add(asignacionperiodoaulaCollectionAsignacionperiodoaulaToAttach);
            }
            periodo.setAsignacionperiodoaulaCollection(attachedAsignacionperiodoaulaCollection);
            Collection<Asignacionperiodocatedratico> attachedAsignacionperiodocatedraticoCollection = new ArrayList<Asignacionperiodocatedratico>();
            for (Asignacionperiodocatedratico asignacionperiodocatedraticoCollectionAsignacionperiodocatedraticoToAttach : periodo.getAsignacionperiodocatedraticoCollection()) {
                asignacionperiodocatedraticoCollectionAsignacionperiodocatedraticoToAttach = em.getReference(asignacionperiodocatedraticoCollectionAsignacionperiodocatedraticoToAttach.getClass(), asignacionperiodocatedraticoCollectionAsignacionperiodocatedraticoToAttach.getIdAsignacionPeriodoCatedratico());
                attachedAsignacionperiodocatedraticoCollection.add(asignacionperiodocatedraticoCollectionAsignacionperiodocatedraticoToAttach);
            }
            periodo.setAsignacionperiodocatedraticoCollection(attachedAsignacionperiodocatedraticoCollection);
            em.persist(periodo);
            for (Asignacionperiodocurso asignacionperiodocursoCollectionAsignacionperiodocurso : periodo.getAsignacionperiodocursoCollection()) {
                Periodo oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionAsignacionperiodocurso = asignacionperiodocursoCollectionAsignacionperiodocurso.getPeriodoidPeriodo();
                asignacionperiodocursoCollectionAsignacionperiodocurso.setPeriodoidPeriodo(periodo);
                asignacionperiodocursoCollectionAsignacionperiodocurso = em.merge(asignacionperiodocursoCollectionAsignacionperiodocurso);
                if (oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionAsignacionperiodocurso != null) {
                    oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionAsignacionperiodocurso.getAsignacionperiodocursoCollection().remove(asignacionperiodocursoCollectionAsignacionperiodocurso);
                    oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionAsignacionperiodocurso = em.merge(oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionAsignacionperiodocurso);
                }
            }
            for (Asignacionperiodoaula asignacionperiodoaulaCollectionAsignacionperiodoaula : periodo.getAsignacionperiodoaulaCollection()) {
                Periodo oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionAsignacionperiodoaula = asignacionperiodoaulaCollectionAsignacionperiodoaula.getPeriodoidPeriodo();
                asignacionperiodoaulaCollectionAsignacionperiodoaula.setPeriodoidPeriodo(periodo);
                asignacionperiodoaulaCollectionAsignacionperiodoaula = em.merge(asignacionperiodoaulaCollectionAsignacionperiodoaula);
                if (oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionAsignacionperiodoaula != null) {
                    oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionAsignacionperiodoaula.getAsignacionperiodoaulaCollection().remove(asignacionperiodoaulaCollectionAsignacionperiodoaula);
                    oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionAsignacionperiodoaula = em.merge(oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionAsignacionperiodoaula);
                }
            }
            for (Asignacionperiodocatedratico asignacionperiodocatedraticoCollectionAsignacionperiodocatedratico : periodo.getAsignacionperiodocatedraticoCollection()) {
                Periodo oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionAsignacionperiodocatedratico = asignacionperiodocatedraticoCollectionAsignacionperiodocatedratico.getPeriodoidPeriodo();
                asignacionperiodocatedraticoCollectionAsignacionperiodocatedratico.setPeriodoidPeriodo(periodo);
                asignacionperiodocatedraticoCollectionAsignacionperiodocatedratico = em.merge(asignacionperiodocatedraticoCollectionAsignacionperiodocatedratico);
                if (oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionAsignacionperiodocatedratico != null) {
                    oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionAsignacionperiodocatedratico.getAsignacionperiodocatedraticoCollection().remove(asignacionperiodocatedraticoCollectionAsignacionperiodocatedratico);
                    oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionAsignacionperiodocatedratico = em.merge(oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionAsignacionperiodocatedratico);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Periodo periodo) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Periodo persistentPeriodo = em.find(Periodo.class, periodo.getIdPeriodo());
            Collection<Asignacionperiodocurso> asignacionperiodocursoCollectionOld = persistentPeriodo.getAsignacionperiodocursoCollection();
            Collection<Asignacionperiodocurso> asignacionperiodocursoCollectionNew = periodo.getAsignacionperiodocursoCollection();
            Collection<Asignacionperiodoaula> asignacionperiodoaulaCollectionOld = persistentPeriodo.getAsignacionperiodoaulaCollection();
            Collection<Asignacionperiodoaula> asignacionperiodoaulaCollectionNew = periodo.getAsignacionperiodoaulaCollection();
            Collection<Asignacionperiodocatedratico> asignacionperiodocatedraticoCollectionOld = persistentPeriodo.getAsignacionperiodocatedraticoCollection();
            Collection<Asignacionperiodocatedratico> asignacionperiodocatedraticoCollectionNew = periodo.getAsignacionperiodocatedraticoCollection();
            List<String> illegalOrphanMessages = null;
            for (Asignacionperiodocurso asignacionperiodocursoCollectionOldAsignacionperiodocurso : asignacionperiodocursoCollectionOld) {
                if (!asignacionperiodocursoCollectionNew.contains(asignacionperiodocursoCollectionOldAsignacionperiodocurso)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Asignacionperiodocurso " + asignacionperiodocursoCollectionOldAsignacionperiodocurso + " since its periodoidPeriodo field is not nullable.");
                }
            }
            for (Asignacionperiodoaula asignacionperiodoaulaCollectionOldAsignacionperiodoaula : asignacionperiodoaulaCollectionOld) {
                if (!asignacionperiodoaulaCollectionNew.contains(asignacionperiodoaulaCollectionOldAsignacionperiodoaula)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Asignacionperiodoaula " + asignacionperiodoaulaCollectionOldAsignacionperiodoaula + " since its periodoidPeriodo field is not nullable.");
                }
            }
            for (Asignacionperiodocatedratico asignacionperiodocatedraticoCollectionOldAsignacionperiodocatedratico : asignacionperiodocatedraticoCollectionOld) {
                if (!asignacionperiodocatedraticoCollectionNew.contains(asignacionperiodocatedraticoCollectionOldAsignacionperiodocatedratico)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Asignacionperiodocatedratico " + asignacionperiodocatedraticoCollectionOldAsignacionperiodocatedratico + " since its periodoidPeriodo field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Collection<Asignacionperiodocurso> attachedAsignacionperiodocursoCollectionNew = new ArrayList<Asignacionperiodocurso>();
            for (Asignacionperiodocurso asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach : asignacionperiodocursoCollectionNew) {
                asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach = em.getReference(asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach.getClass(), asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach.getIdAsignacionPeriodoCurso());
                attachedAsignacionperiodocursoCollectionNew.add(asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach);
            }
            asignacionperiodocursoCollectionNew = attachedAsignacionperiodocursoCollectionNew;
            periodo.setAsignacionperiodocursoCollection(asignacionperiodocursoCollectionNew);
            Collection<Asignacionperiodoaula> attachedAsignacionperiodoaulaCollectionNew = new ArrayList<Asignacionperiodoaula>();
            for (Asignacionperiodoaula asignacionperiodoaulaCollectionNewAsignacionperiodoaulaToAttach : asignacionperiodoaulaCollectionNew) {
                asignacionperiodoaulaCollectionNewAsignacionperiodoaulaToAttach = em.getReference(asignacionperiodoaulaCollectionNewAsignacionperiodoaulaToAttach.getClass(), asignacionperiodoaulaCollectionNewAsignacionperiodoaulaToAttach.getIdAsignacionPeriodoAula());
                attachedAsignacionperiodoaulaCollectionNew.add(asignacionperiodoaulaCollectionNewAsignacionperiodoaulaToAttach);
            }
            asignacionperiodoaulaCollectionNew = attachedAsignacionperiodoaulaCollectionNew;
            periodo.setAsignacionperiodoaulaCollection(asignacionperiodoaulaCollectionNew);
            Collection<Asignacionperiodocatedratico> attachedAsignacionperiodocatedraticoCollectionNew = new ArrayList<Asignacionperiodocatedratico>();
            for (Asignacionperiodocatedratico asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedraticoToAttach : asignacionperiodocatedraticoCollectionNew) {
                asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedraticoToAttach = em.getReference(asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedraticoToAttach.getClass(), asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedraticoToAttach.getIdAsignacionPeriodoCatedratico());
                attachedAsignacionperiodocatedraticoCollectionNew.add(asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedraticoToAttach);
            }
            asignacionperiodocatedraticoCollectionNew = attachedAsignacionperiodocatedraticoCollectionNew;
            periodo.setAsignacionperiodocatedraticoCollection(asignacionperiodocatedraticoCollectionNew);
            periodo = em.merge(periodo);
            for (Asignacionperiodocurso asignacionperiodocursoCollectionNewAsignacionperiodocurso : asignacionperiodocursoCollectionNew) {
                if (!asignacionperiodocursoCollectionOld.contains(asignacionperiodocursoCollectionNewAsignacionperiodocurso)) {
                    Periodo oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso = asignacionperiodocursoCollectionNewAsignacionperiodocurso.getPeriodoidPeriodo();
                    asignacionperiodocursoCollectionNewAsignacionperiodocurso.setPeriodoidPeriodo(periodo);
                    asignacionperiodocursoCollectionNewAsignacionperiodocurso = em.merge(asignacionperiodocursoCollectionNewAsignacionperiodocurso);
                    if (oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso != null && !oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso.equals(periodo)) {
                        oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso.getAsignacionperiodocursoCollection().remove(asignacionperiodocursoCollectionNewAsignacionperiodocurso);
                        oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso = em.merge(oldPeriodoidPeriodoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso);
                    }
                }
            }
            for (Asignacionperiodoaula asignacionperiodoaulaCollectionNewAsignacionperiodoaula : asignacionperiodoaulaCollectionNew) {
                if (!asignacionperiodoaulaCollectionOld.contains(asignacionperiodoaulaCollectionNewAsignacionperiodoaula)) {
                    Periodo oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionNewAsignacionperiodoaula = asignacionperiodoaulaCollectionNewAsignacionperiodoaula.getPeriodoidPeriodo();
                    asignacionperiodoaulaCollectionNewAsignacionperiodoaula.setPeriodoidPeriodo(periodo);
                    asignacionperiodoaulaCollectionNewAsignacionperiodoaula = em.merge(asignacionperiodoaulaCollectionNewAsignacionperiodoaula);
                    if (oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionNewAsignacionperiodoaula != null && !oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionNewAsignacionperiodoaula.equals(periodo)) {
                        oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionNewAsignacionperiodoaula.getAsignacionperiodoaulaCollection().remove(asignacionperiodoaulaCollectionNewAsignacionperiodoaula);
                        oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionNewAsignacionperiodoaula = em.merge(oldPeriodoidPeriodoOfAsignacionperiodoaulaCollectionNewAsignacionperiodoaula);
                    }
                }
            }
            for (Asignacionperiodocatedratico asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico : asignacionperiodocatedraticoCollectionNew) {
                if (!asignacionperiodocatedraticoCollectionOld.contains(asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico)) {
                    Periodo oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico = asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico.getPeriodoidPeriodo();
                    asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico.setPeriodoidPeriodo(periodo);
                    asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico = em.merge(asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico);
                    if (oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico != null && !oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico.equals(periodo)) {
                        oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico.getAsignacionperiodocatedraticoCollection().remove(asignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico);
                        oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico = em.merge(oldPeriodoidPeriodoOfAsignacionperiodocatedraticoCollectionNewAsignacionperiodocatedratico);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = periodo.getIdPeriodo();
                if (findPeriodo(id) == null) {
                    throw new NonexistentEntityException("The periodo with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Periodo periodo;
            try {
                periodo = em.getReference(Periodo.class, id);
                periodo.getIdPeriodo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The periodo with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Asignacionperiodocurso> asignacionperiodocursoCollectionOrphanCheck = periodo.getAsignacionperiodocursoCollection();
            for (Asignacionperiodocurso asignacionperiodocursoCollectionOrphanCheckAsignacionperiodocurso : asignacionperiodocursoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Periodo (" + periodo + ") cannot be destroyed since the Asignacionperiodocurso " + asignacionperiodocursoCollectionOrphanCheckAsignacionperiodocurso + " in its asignacionperiodocursoCollection field has a non-nullable periodoidPeriodo field.");
            }
            Collection<Asignacionperiodoaula> asignacionperiodoaulaCollectionOrphanCheck = periodo.getAsignacionperiodoaulaCollection();
            for (Asignacionperiodoaula asignacionperiodoaulaCollectionOrphanCheckAsignacionperiodoaula : asignacionperiodoaulaCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Periodo (" + periodo + ") cannot be destroyed since the Asignacionperiodoaula " + asignacionperiodoaulaCollectionOrphanCheckAsignacionperiodoaula + " in its asignacionperiodoaulaCollection field has a non-nullable periodoidPeriodo field.");
            }
            Collection<Asignacionperiodocatedratico> asignacionperiodocatedraticoCollectionOrphanCheck = periodo.getAsignacionperiodocatedraticoCollection();
            for (Asignacionperiodocatedratico asignacionperiodocatedraticoCollectionOrphanCheckAsignacionperiodocatedratico : asignacionperiodocatedraticoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Periodo (" + periodo + ") cannot be destroyed since the Asignacionperiodocatedratico " + asignacionperiodocatedraticoCollectionOrphanCheckAsignacionperiodocatedratico + " in its asignacionperiodocatedraticoCollection field has a non-nullable periodoidPeriodo field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(periodo);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Periodo> findPeriodoEntities() {
        return findPeriodoEntities(true, -1, -1);
    }

    public List<Periodo> findPeriodoEntities(int maxResults, int firstResult) {
        return findPeriodoEntities(false, maxResults, firstResult);
    }

    private List<Periodo> findPeriodoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Periodo.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Periodo findPeriodo(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Periodo.class, id);
        } finally {
            em.close();
        }
    }

    public int getPeriodoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Periodo> rt = cq.from(Periodo.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
